package br.com.massai.controller.interceptors;

import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * @author Diogo Medeiros
 * @since 2014-08-06
 * @see Essa classe é responsável por gerar os logs em arquivos diferentes do servidor, 
 * garantindo um maior controle e obtenção de informações referentes a ações no banco de dados. 
 * Possui um único método gerador dos logs {@link #logger(InvocationContext)}
 * */
public class LoggedInterceptors {

	private final Logger LOG = LogManager.getLogger(getClass().getName());

	@AroundInvoke
	public Object logger(InvocationContext invocationContext) throws Throwable {
		try{
			LOG.info(new StringBuilder("## TARGET CLASS: ").append(invocationContext.getTarget().getClass().getName()));
			LOG.info(new StringBuilder("## METHOD INVOCKED: ").append(invocationContext.getMethod().getName()));

			for(Object arg : invocationContext.getParameters())
				LOG.info(new StringBuilder("## ARGUMENT: \n").append(arg));

			Object result = invocationContext.proceed();
			LOG.info(new StringBuilder("## RESULT: ").append(result));
			LOG.info(new StringBuilder("-------------------------------------------------------------------------\n"));
			return result;

		} catch (Throwable e) {
			LOG.error("## AN EXCEPTION OCCURRED!!!");
			LOG.error(e.getMessage());
			LOG.info(new StringBuilder("-------------------------------------------------------------------------\n"));
			e.printStackTrace();
			throw new Throwable(e);
		} finally {
			LOG.exit();
		}
	}
}
